package config

import (
	"errors"
	"fmt"
	"github.com/spf13/viper"
	"my_music_server/common/utils"
)

//Loader 执行加载器
type loader struct {
}

//NewLoader 使用工厂模式构建配置加载执行器
func NewLoader() *loader  {
	return new(loader)
}

func (loader *loader) executeLoad(strategy LoadStrategy) (err error) {
	err = strategy.Load()
	return err
}

//LoadStrategy 策略规则
type LoadStrategy interface {
	Load() error
}

//YamlLoadStrategy 加载yaml文件的策略
type YamlLoadStrategy struct {
}

func (yamlLoadStrategy *YamlLoadStrategy) Load() error {
	//导入配置文件
	viper.SetConfigType("yaml")
	isYamlFileExists, _ := utils.PathExists("application.yaml")
	isYmlFileExists, _ := utils.PathExists("application.yml")
	if isYmlFileExists {
		viper.SetConfigFile("./application.yml")
	}else if isYamlFileExists{
		viper.SetConfigFile("./application.yaml")
	}else {
		return errors.New("文件名称错误")
	}
	//读取配置文件
	err := viper.ReadInConfig()
	if err != nil {
		fmt.Println(err.Error())
	}

	//将配置文件读到结构体中
	err = viper.Unmarshal(&AppicationConfig)
	if err != nil {
		fmt.Println(err.Error())
	}
	return err
}

//JsonLoadStrategy 加载json文件的策略
type JsonLoadStrategy struct {
}

func (jsonLoadStrategy *JsonLoadStrategy) Load() error {
	//导入配置文件
	viper.SetConfigType("json")
	viper.SetConfigFile("./application.json")
	//读取配置文件
	err := viper.ReadInConfig()
	if err != nil {
		fmt.Println(err.Error())
	}

	//将配置文件读到结构体中
	err = viper.Unmarshal(&AppicationConfig)
	if err != nil {
		fmt.Println(err.Error())
	}
	return err
}

//加载properties
type PropertiesStrategy struct {

}

func (propertiesStrategy *PropertiesStrategy) Load() error {
	//导入配置文件
	viper.SetConfigType("properties")
	viper.SetConfigFile("./application.properties")
	//读取配置文件
	err := viper.ReadInConfig()
	if err != nil {
		fmt.Println(err.Error())
	}

	//将配置文件读到结构体中
	err = viper.Unmarshal(&AppicationConfig)
	if err != nil {
		fmt.Println(err.Error())
	}
	return err
}